package com.joysuch.wwyt.workflow.service.impl;

import com.joysuch.wwyt.core.common.ajax.ResultBean;
import com.joysuch.wwyt.core.common.util.PageDataUtils;
import com.joysuch.wwyt.edu.bean.EduCertificateUserListBean;
import com.joysuch.wwyt.edu.entity.EduCertificateUser;
import com.joysuch.wwyt.edu.enums.CertificateTypes;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateBean;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateListBean;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateQueryBean;
import com.joysuch.wwyt.workflow.bean.WorkFlowFormTemplateTypeBean;
import com.joysuch.wwyt.workflow.entity.WorkFlowFormTemplate;
import com.joysuch.wwyt.workflow.entity.WorkFlowFormTemplateType;
import com.joysuch.wwyt.workflow.repository.WorkFlowFormTemplateDao;
import com.joysuch.wwyt.workflow.repository.WorkFlowFormTemplateTypeDao;
import com.joysuch.wwyt.workflow.service.WorkFlowFormTemplateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class WorkFlowFormTemplateServiceImpl implements WorkFlowFormTemplateService {

    @Autowired
    private WorkFlowFormTemplateDao formTemplateDao;

    @Autowired
    private WorkFlowFormTemplateTypeDao formTemplateTypeDao;

    @Override
    public Page<WorkFlowFormTemplateBean> pageList(WorkFlowFormTemplateQueryBean bean, Pageable pageable) {
        Specification<WorkFlowFormTemplate> spec =new Specification<WorkFlowFormTemplate>() {
            @Override
            public Predicate toPredicate(Root<WorkFlowFormTemplate> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
                List<Predicate> predicates = new ArrayList<>();
                if (bean.getName() != null) {
                    predicates.add( cb.like(root.get("name"), "%"+bean.getName()+"%"));
                }
                if (bean.getType() != null && bean.getType() !=0) {
                    predicates.add( cb.equal(root.get("type"), bean.getType()));
                }
                predicates.add( cb.equal(root.get("state"), 1));
                return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        Page<WorkFlowFormTemplate> page = formTemplateDao.findAll(spec, pageable);
        return PageDataUtils.convertPageData(page,
                new PageDataUtils.PageDataConvert<WorkFlowFormTemplateBean, WorkFlowFormTemplate>() {
                    @Override
                    public WorkFlowFormTemplateBean convert(WorkFlowFormTemplate f) {
                        WorkFlowFormTemplateBean bean = new WorkFlowFormTemplateBean();
                        BeanUtils.copyProperties(f, bean);
                        WorkFlowFormTemplateType templateType = formTemplateTypeDao.findById(f.getType()).orElse(null);
                        if(templateType != null) {
                            bean.setTypeName(templateType.getName());
                        }
                        return bean;
                    }

                });
    }


    @Override
    public ResultBean save(WorkFlowFormTemplateBean bean) {
        WorkFlowFormTemplate formTemplate = null;
        if(bean.getId() == null || bean.getId() ==0){
            formTemplate = new WorkFlowFormTemplate();
            formTemplate.setState(1);
            if(checkDuplicateName(bean,true)){
                return ResultBean.wrapErrorResultDefault("表单模板名称已经存在：在同一类型下名称不能重复");
            }
        }else{
            formTemplate = findById(bean.getId());
            if(formTemplate == null){
                return ResultBean.wrapErrorResultDefault("当前的表单模板已不存在，无法保存。");
            }
            if(checkDuplicateName(bean,false)){
                return ResultBean.wrapErrorResultDefault("表单模板名称已经存在：在同一类型下名称不能重复");
            }
        }
        BeanUtils.copyProperties(bean, formTemplate);
        formTemplateDao.save(formTemplate);
        return ResultBean.success(formTemplate);
    }

    private boolean checkDuplicateName(WorkFlowFormTemplateBean bean, boolean isNew){
        boolean result  = false;
        WorkFlowFormTemplate formTemplate = formTemplateDao.findFirstByNameAndType(bean.getName(),bean.getType());
        if(isNew){
            if(formTemplate != null){
                return true;
            }
        }else{
            if(formTemplate != null && bean.getId() != formTemplate.getId()){
                return true;
            }
        }
        return result;
    }

    @Override
    public void delete(Long id) {
        formTemplateDao.deleteById(id);
    }

    @Override
    public WorkFlowFormTemplate findById(Long id) {
        return formTemplateDao.findById(id).orElse(null);
    }
}
